#include <stdio.h>

void main()
{
    int info = 1;
    // 1、 指针常量：指针的值不能被修改，但可以通过指针修改它所指向的内容
    int *const p = &info;
    // p的值不能改变,不能指向别人
    // p = NULL; // error
    printf("p is %d\n", *p);
    *p = *p + 1;
    printf("*p = *p + 1 is  %d\n", info);

    // 2、常量指针：指针的值可以被修改，但不能通过指针修改它所指向的内容。
    int name = 2;
    const int *q = &name;
    int const *n = &name; // 等价于 const int *n
    // 不能通过指针修改指向的值
    // *q = 3; // error
    name = 3;
    printf("q is %d\n", *q);
    printf("q is %p\n", q);
    q++;
    printf("q is %p\n", q);
    printf("q is %d\n", *q);
    printf("name is %d\n", name);

    // 3、指向常量的指针常量：指针的值不能被修改，且不能通过指针修改它所指向的内容。
    int x = 10;
    int y = 20;
    const int *const ptr = &x; // ptr 是一个指向常量的指针常量
    // *ptr = 20; // 错误：不能通过 ptr 修改它所指向的内容
    // ptr = &y; // 错误：不能修改 ptr 的值
    x++;
    printf("x is %d\n", *ptr);
    printf("x is  %d\n", x);
}